package negocio;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import beans.FacturaVO;

@Entity
@Table(name="facturas")
public class Factura implements Serializable 
{
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_factura", nullable=false)
	private int id_factura;
	
	@Column(name="total", nullable=true)
	private float total;
	
	@OneToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="id_mesa", referencedColumnName="id_mesa")
	private Mesa mesa;
	
	private String formaPago;
	
	@Column(name="fecha_de_emision", nullable=false)
	private Date fecha_de_emision;
	
	public Factura()
	{
		total = 0;
	}
	
	public float getTotal() {
		return total;
	}
	public void setTotal(float total) {
		this.total = total;
	}
	public Mesa getMesa() {
		return mesa;
	}
	public void setMesa(Mesa mesa) {
		this.mesa = mesa;
	}
	public String getFormaPago() {
		return formaPago;
	}
	public void setFormaPago(String formaPago) {
		this.formaPago = formaPago;
	}
	public Date getFecha_de_emision() {
		return fecha_de_emision;
	}
	public void setFecha_de_emision(Date fecha_de_emision) {
		this.fecha_de_emision = fecha_de_emision;
	}
	public int getId_factura() {
		return id_factura;
	}
	public void setId_factura(int id_factura) {
		this.id_factura = id_factura;
	}
	
	public FacturaVO getVO()
	{
		FacturaVO factVO = new FacturaVO();
		factVO.setFecha_de_emision(getFecha_de_emision());
		factVO.setFormaPago(getFormaPago());
		factVO.setId_factura(getId_factura());		
		factVO.setMesa(getMesa().getVO());
		factVO.setTotal(getTotal());
		
		return factVO;
	}

	
	@Override
	public String toString() {
		return "Factura [id_factura=" + id_factura + ", total=" + total
				+ ", mesa=" + mesa + ", formaPago=" + formaPago
				+ ", fecha_de_emision=" + fecha_de_emision + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime
				* result
				+ ((fecha_de_emision == null) ? 0 : fecha_de_emision.hashCode());
		result = prime * result
				+ ((formaPago == null) ? 0 : formaPago.hashCode());
		result = prime * result + id_factura;
		result = prime * result + ((mesa == null) ? 0 : mesa.hashCode());
		result = prime * result + Float.floatToIntBits(total);
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Factura other = (Factura) obj;
		if (fecha_de_emision == null) {
			if (other.fecha_de_emision != null)
				return false;
		} else if (!fecha_de_emision.equals(other.fecha_de_emision))
			return false;
		if (formaPago == null) {
			if (other.formaPago != null)
				return false;
		} else if (!formaPago.equals(other.formaPago))
			return false;
		if (id_factura != other.id_factura)
			return false;
		if (mesa == null) {
			if (other.mesa != null)
				return false;
		} else if (!mesa.equals(other.mesa))
			return false;
		if (Float.floatToIntBits(total) != Float.floatToIntBits(other.total))
			return false;
		return true;
	}
	
	public void calcularTotal() {
		for(Pedido p : mesa.getPedidos()){
			if(p.isFacturable()){
				for(Plato plato : p.getPlatos()){
					total += plato.getPrecio();
				}
			}
		}
	}
}
